<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<script src="../../../resources/js-test.js"></script>
</head>
<body>
<script>

description("Test the translate attribute.");

var parent = document.createElement("div");
document.body.appendChild(parent);

function testFor(initialAttribute, initialExpectation, setValue, lastExpectation, lastAttributeExpectation)
{
    var target = document.createElement("span");
    parent.appendChild(target);

    window.target = target;
    window.initialExpectation = initialExpectation;
    window.lastExpectation = lastExpectation;
    window.lastAttributeExpectation = lastAttributeExpectation;

    if (undefined !== initialAttribute)
        target.setAttribute("translate", initialAttribute);
    shouldBe("target.translate", "initialExpectation");

    if (undefined !== setValue)
        target.translate = setValue;
    shouldBe("target.translate", "lastExpectation");
    shouldBe("target.getAttribute('translate')", "lastAttributeExpectation");

    parent.removeChild(target);
}

window.target = document.createElement("p");
parent.appendChild(target);

debug('translate should be "yes" by default.');
shouldBeTrue("target.translate");
shouldBeNull("target.getAttribute('translate')");

debug('\ntarget.translate = false;');
target.translate = false;
shouldBeFalse("target.translate");
shouldBeEqualToString("target.getAttribute('translate')", "no");

debug('\ntarget.setAttribute("translate", "yes");');
target.setAttribute("translate", "yes");
shouldBeTrue("target.translate");
shouldBeEqualToString("target.getAttribute('translate')", "yes");

debug('\ntarget.setAttribute("translate", "no");');
target.setAttribute("translate", "no");
shouldBeFalse("target.translate");
shouldBeEqualToString("target.getAttribute('translate')", "no");

debug('\ntarget.setAttribute("translate", "YES");');
target.setAttribute("translate", "YES");
shouldBeTrue("target.translate");
shouldBeEqualToString("target.getAttribute('translate')", "YES");

debug('\ntarget.setAttribute("translate", "NO");');
target.setAttribute("translate", "NO");
shouldBeFalse("target.translate");
shouldBeEqualToString("target.getAttribute('translate')", "NO");

debug('\ntarget.setAttribute("translate", "INVALID");');
target.setAttribute("translate", "INVALID");
shouldBeTrue("target.translate");
shouldBeEqualToString("target.getAttribute('translate')", "INVALID");

debug("\nRemoving translate attribute.");
target.removeAttribute("translate");
shouldBeNull("target.getAttribute('translate')");
shouldBeTrue("target.translate");

debug("\nCreating targetChild element as a child of target.");
window.targetChild = document.createElement("span");
target.appendChild(targetChild);
shouldBeTrue("targetChild.translate");
shouldBeNull("targetChild.getAttribute('translate')");

debug("\nSetting target.translate = false. targetChild should inherit the translate value from its parents.");
target.translate = false;
shouldBeFalse("targetChild.translate");
shouldBeNull("targetChild.getAttribute('translate')");

debug("\nSetting targetChild.setAttribute('translate', 'INVALID'). Should inherit the translate value from its parents.");
targetChild.setAttribute("translate", "INVALID");
shouldBeFalse("target.translate");
shouldBeEqualToString("target.getAttribute('translate')", "no");
shouldBeFalse("targetChild.translate");
shouldBeEqualToString("targetChild.getAttribute('translate')", "INVALID");

debug("\ntargetChild.translate = true;");
targetChild.translate = true;
shouldBeTrue("targetChild.translate");
shouldBeEqualToString("targetChild.getAttribute('translate')", "yes");
shouldBeFalse("target.translate");
shouldBeEqualToString("target.getAttribute('translate')", "no");

parent.removeChild(target);

debug("\n");

testFor(undefined, true, undefined, true, null);
testFor(undefined, true, false, false, "no");
testFor(undefined, true, true, true, "yes");
testFor(undefined, true, 0, false, "no"); // 0 will be coerced to false
testFor(undefined, true, 1, true, "yes"); // 0 will be coerced to true
testFor(undefined, true, "invalid", true, "yes"); // string will be coerced to true
testFor(undefined, true, "false", true, "yes"); // ...even if the string is "false" (as Firefox does).

testFor("yes", true, undefined, true, "yes");
testFor("yes", true, false, false, "no");
testFor("yes", true, true, true, "yes");
testFor("yes", true, 0, false, "no");
testFor("yes", true, 1, true, "yes");
testFor("yes", true, "invalid", true, "yes");
testFor("yes", true, "false", true, "yes");

testFor("no", false, undefined, false, "no");
testFor("no", false, false, false, "no");
testFor("no", false, true, true, "yes");
testFor("no", false, 0, false, "no");
testFor("no", false, 1, true, "yes");
testFor("no", false, "invalid", true, "yes");
testFor("no", false, "false", true, "yes");

// various initial values
testFor("", true, undefined, true, "");
testFor("", true, 1, true, "yes");
testFor("YES", true, undefined, true, "YES");
testFor("YES", true, 1, true, "yes");
testFor("NO", false, undefined, false, "NO");
testFor("NO", false, 0, false, "no");
testFor("invalid", true, undefined, true, "invalid");
testFor("invalid", true, 1, true, "yes");
testFor("no  ", true, undefined, true, "no  ");
testFor("no  ", true, 1, true, "yes");
testFor("no  ", true, 0, false, "no");
testFor("0", true, undefined, true, "0");
testFor("0", true, 0, false, "no");
testFor("1", true, undefined, true, "1");
testFor("1", true, 0, false, "no");
</script>
</body>
</html>
